package com.xdb.sqlparser.ast.expr;

import com.xdb.sqlparser.ast.AbstractSQLExprImpl;
import com.xdb.sqlparser.util.SQLUtils;
import com.xdb.sqlparser.visitor.SQLAstVisitor;

public class SQLTimestampExpr extends AbstractSQLExprImpl {

	protected String literal;
	protected String timeZone;
	protected boolean withTimeZone = false;

	public SQLTimestampExpr() {

	}

	public String getLiteral() {
		return literal;
	}

	public void setLiteral(String literal) {
		this.literal = literal;
	}

	public String getTimeZone() {
		return this.timeZone;
	}

	public void setTimeZone(String timeZone) {
		this.timeZone = timeZone;
	}

	public boolean isWithTimeZone() {
		return withTimeZone;
	}

	public void setWithTimeZone(boolean withTimeZone) {
		this.withTimeZone = withTimeZone;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((literal == null) ? 0 : literal.hashCode());
		result = prime * result + ((timeZone == null) ? 0 : timeZone.hashCode());
		result = prime * result + (withTimeZone ? 1231 : 1237);
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (getClass() != obj.getClass()) {
			return false;
		}
		SQLTimestampExpr other = (SQLTimestampExpr) obj;
		if (literal == null) {
			if (other.literal != null) {
				return false;
			}
		} else if (!literal.equals(other.literal)) {
			return false;
		}
		if (timeZone == null) {
			if (other.timeZone != null) {
				return false;
			}
		} else if (!timeZone.equals(other.timeZone)) {
			return false;
		}
		if (withTimeZone != other.withTimeZone) {
			return false;
		}
		return true;
	}

	@Override
	protected void accept0(SQLAstVisitor visitor) {
		visitor.visit(this);

		visitor.endVisit(this);
	}

	public String toString() {
		return SQLUtils.toSQLString(this, null);
	}
}
